/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo.persistencia;

/**
 *
 * @author jefferson
 */
import visao.usuario.InterfaceLogin;
import java.sql.*;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import visao.usuario.InterfaceMenuAdministrador;
import visao.usuario.InterfaceMenuAuxiliar;
import visao.usuario.InterfaceMenuVendedor;
import java.util.logging.Logger;
import java.util.logging.Level;
import java.io.IOException;
import java.util.ArrayList;
import modelo.dominio.Usuario;


public class ControleAcesso {
	public static String acesso;
	public static Usuario usuario;
	
	private final PersistenciaUsuario persistenciaUsuario = new PersistenciaUsuario();
	
	/**Método responsável cadastrar o usuário no banco de dados.
	*/
	public static boolean cadastroUsuario(String username,String passwd,Boolean admin){
		ResultSet rs;
		try {
			Statement stat = Conecta.getConnection().conn.createStatement();
			rs = stat.executeQuery("select * from Usuario where nome='"+username+"'");
			if (rs.next()){
				modelo.persistencia.Log.getLoginstance(null).error("Tentativa de cadstro de usuário já existente "+username);
				return false;
			}
			stat.executeUpdate("insert into Usuario (nome,senha,acesso) values ('"+username+"','"+processa(passwd)+"','"+admin.toString()+"')");
			modelo.persistencia.Log.getLoginstance(null).info("Usuário "+username+" cadastrado com sucesso");
			return true;
		} catch (SQLException e) {
			modelo.persistencia.Log.getLoginstance(null).error(e.getMessage());
			return false;
		}
	}
	
	
	/**Método responsável por logar corretamente o usuario
	 * é verificado se o login e a senha são correspondentes
	*/
	public static boolean login(String usuario, String senha, boolean adminRequired){
		ResultSet rs;
		try {
			Statement stat = Conecta.getConnection().conn.createStatement();
			rs = stat.executeQuery("select * from Usuario where nome='"+usuario+"'");
			if (rs.next()){
				if (adminRequired){
					if (rs.getString("senha").equals(processa(senha)) && isAdmin(usuario)){
						modelo.persistencia.Log.getLoginstance(null).info("Usuário "+usuario+" Logado com sucesso no sistema");
						return true;
					}
					else{
						modelo.persistencia.Log.getLoginstance(null).error("Senha informada está errada");
						return false;
					}		
				}
				else{
					if(rs.getString("senha").equals(processa(senha))){
						modelo.persistencia.Log.getLoginstance(null).info("Usuário "+usuario+" Logado com sucesso no sistema");
						return true;
					}
					else{
						modelo.persistencia.Log.getLoginstance(null).error("Senha informada está errada");
						return false;
					}
				}
			}
			else{
				return false;
			}
		} catch (SQLException e) {
			modelo.persistencia.Log.getLoginstance(null).error(e.getMessage());
			return false;
		}
	}
	
	public static void logInUsuario(Usuario usuario){
		Logger logger = Logger.getLogger("Usuario");
		try {
			logger.setLevel(Level.ALL);
			logger.log(Level.INFO,usuario.getNome()+" entrou no sistema.");
		} catch (SecurityException e) {
			e.printStackTrace();
		}
	}

	public static Usuario login(String nome, String senha,ArrayList<Usuario> listUsuarios){
		if(!listUsuarios.isEmpty()){
			for(Usuario usuario : listUsuarios){
				if(usuario.getNome().equalsIgnoreCase(nome) && usuario.getSenha().equals(senha)){
					acesso = usuario.getAcesso();
					return usuario;
				}
			}
		}
		return null;
	}
	
	/**Método que chama uma nova interface de login e desloga o usuário
	*/
	public static void logoff(){
		logOffUsuario(usuario);
		usuario = null;
		acesso ="";		
		new InterfaceLogin().setVisible(true); 
	}

	/**Método responsável por fazer cada usuário voltar para seu respectivo menu.
	*/
	public static void voltarMenuPrincipal(){
		if(acesso.equalsIgnoreCase("admin")){
			new InterfaceMenuAdministrador().setVisible(true); 
		}
		else{
			if(acesso.equalsIgnoreCase("vendedor")){
				new InterfaceMenuVendedor().setVisible(true); 
			}
			else{
				new InterfaceMenuAuxiliar().setVisible(true); 
			}
		}
	}
	
	/**Método para verificar se o usuario que logou é administrador
	*/
	public static boolean isAdmin(String username){
		ResultSet rs;
		try {
			Statement stat = Conecta.getConnection().conn.createStatement();
			rs = stat.executeQuery("select * from Usuario where nome='"+username+"'");
			if (rs.next()){
				return rs.getString("admin").equalsIgnoreCase("true");
			}
			else{
				return false;
			}
		} catch (SQLException e) {
			modelo.persistencia.Log.getLoginstance(null).error(e.getMessage());
			return false;
		}
		
	}
	
	
	/**Método para comparar se a senha esta correta.
	*/
	public static String processa(String senha){
		String sen = "";
		MessageDigest md = null;
		try {
			md = MessageDigest.getInstance("SHA-1");
		} catch (NoSuchAlgorithmException e) {
			modelo.persistencia.Log.getLoginstance(null).error(e.getMessage());
		}
		BigInteger hash = new BigInteger(1, md.digest(senha.getBytes()));
		sen = hash.toString(16);			
		return sen;
	}
	
	
	/**Método para fazer o logoff do usuario que estiver logado
	*/
	public static void logOffUsuario(Usuario usuario){
		Logger logger = Logger.getLogger("Usuario");
		try {
			logger.setLevel(Level.ALL);
			logger.log(Level.INFO, usuario.getNome()+" saiu do sistema.");
		} catch (SecurityException e) {
			e.printStackTrace();
		}
	}
}
